package qc.module.platform.mapper;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import qc.common.core.enums.DataTypeEnum;
import qc.common.core.enums.ResourceStatusFlagEnum;
import qc.module.platform.dto.param.item.ParamItemDto;
import qc.module.platform.entity.QcParamItem;

import java.util.List;

/**
 * ParamItemMapper
 *
 * @author QuCheng Tech
 * @since 2024/2/22
 */
@Mapper
public interface ParamItemMapper {
    ParamItemMapper MAPPER = Mappers.getMapper(ParamItemMapper.class);

    @Mapping(target = "datatype", source = "datatype.index")
    @Mapping(target = "flag", source = "flag.index")
    ParamItemDto toDto(QcParamItem en);

    @Mapping(target = "datatype", ignore = true)
    @Mapping(target = "flag", ignore = true)
    QcParamItem toEntity(ParamItemDto dto);

    List<ParamItemDto> toDtoList(List<QcParamItem> list);

    /**
     * DTO转换为Entity
     * @param dto 
     * @return Entity
     * @author QuCheng Tech
     * @since 2024/3/14
     */
    default QcParamItem dtoToEntity(ParamItemDto dto) {
        //DTO转换为Entity
        QcParamItem en = ParamItemMapper.MAPPER.toEntity(dto);

        //处理数据类型，非空时进行转换，空值时使用默认
        Integer datatype = null;
        if (dto.getDatatype() > 0x0){
            try {
                datatype = dto.getDatatype();
            } catch (NumberFormatException exception) {
                //转换错误不处理，使用默认状态
            }
        }else {
            datatype = 0x0;
        }
        en.setDatatype(getDataTypeEnum(datatype));

        //处理标记，非空时进行转换，空值时使用默认
        Integer flag = null;
        if (dto.getFlag() > 0x0) {
            try {
                flag = dto.getFlag();
            } catch (NumberFormatException exception) {
                //转换错误不处理，使用默认状态
            }
        }else{
            flag = 0x0;
        }
        en.setFlag(getResourceStatusFlagEnum(flag));

        return en;
    }

    static DataTypeEnum getDataTypeEnum(Integer index) {
        if (index != null && index > 0x0) {
            for (DataTypeEnum item : DataTypeEnum.values()) {
                if (item.getIndex() == index) {//判断序号使用getIndex，判断内容使用getName
                    return item;
                }
            }
        }
        return DataTypeEnum.STRING;
    }

    static ResourceStatusFlagEnum getResourceStatusFlagEnum(Integer index) {
        if (index != null && index > 0x0) {
            for (ResourceStatusFlagEnum item : ResourceStatusFlagEnum.values()) {
                if (item.getIndex() == index) {//判断序号使用getIndex，判断内容使用getName
                    return item;
                }
            }
        }
        return ResourceStatusFlagEnum.NORMAL;
    }
}
